package day06.sparksql

import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}

object SparkSQLDemo_2_DataSet {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder().appName("SparkSQLDemo_2_DataSet").master("local[2]").getOrCreate()
    import spark.implicits._  //这个也必须加，不然不能将DataFrame转换为Dataset
    val personDF: DataFrame = spark.read.json("hdfs://master:9000/data/people.json")

    //DataSet和DataFrame之间可以互相转换，用as[U]方法，注意as的泛型U就是下面定义的case class样例类
    val personDS: Dataset[Person] = personDF.as[Person]
    println("personDs = ")
    personDS.show()

    //将原始数据构造为DataSet。注意这些数据可以直接用toDS转换为DataSet是因为这些原始数据本身数据类型已经确定好了。
    //上面的读取JSon数据的DataFrame不能用toDS是因为数据类型不明确。因此自定义样例类封装数据类型，然后调用as[样例类]去转换
    val ds2: Dataset[Int] = Seq(1,2,3,4,5,6).toDS()
    val ds3: Dataset[(String, Int, Int)] = Seq(("zhangsan",20,90),("wangwu",25,125)).toDS()
    ds2.show()
    ds3.show()
  }
}
//定义一个确切的DataSet的类型，比如说封装一下数据什么的。，一定要注意数据的类型不要错（是Long还是Int）
//这里的字段名称和数据中的字段名称要一一对应，不然会报错
//注意在这里获取Json的格式数据，数值默认为Long类型，并不是Int类型，注意如果转换DataSet，封装数据的参数类型千万不要错。
case class Person(name: String, age: Long, facevalue: Long)
